{
GtkAtSpiContext *self = GTK_AT_SPI_CONTEXT (ctx);
GtkAccessible *accessible = gtk_at_context_get_accessible (ctx);
- GtkATContext *child_context;
+ GtkATContext *child_context = gtk_accessible_get_at_context (child);
+ GtkWidget *parent_widget;
+ GtkWidget *child_widget;
+ int idx = 0;
- if (!GTK_IS_WIDGET (accessible))
+ if (!GTK_IS_WIDGET (accessible) || !GTK_IS_WIDGET (child))
return;
- child_context = gtk_accessible_get_at_context (child);
if (child_context == NULL)
return;
- GtkWidget *parent_widget = GTK_WIDGET (accessible);
- GtkWidget *child_widget = GTK_WIDGET (child);
- int idx = 0;
+ parent_widget = GTK_WIDGET (accessible);
+ child_widget = GTK_WIDGET (child);
+
+ /* handle the stack page special case */
+ if (GTK_IS_WIDGET (child) &&
+ GTK_IS_STACK (gtk_widget_get_parent (GTK_WIDGET (child))))
+ {
+ GtkWidget *stack;
+ GtkStackPage *page;
+ GListModel *pages;
+
+ stack = gtk_widget_get_parent (GTK_WIDGET (child));
+ page = gtk_stack_get_page (GTK_STACK (stack), GTK_WIDGET (child));
+ pages = G_LIST_MODEL (gtk_stack_get_pages (GTK_STACK (stack)));
+ idx = 0;
+ for (guint i = 0; i < g_list_model_get_n_items (pages); i++)
+ {
+ GtkStackPage *item = g_list_model_get_item (pages, i);
+
+ g_object_unref (item);
+
+ if (!gtk_accessible_should_present (GTK_ACCESSIBLE (item)))
+ continue;
+
+ if (item == page)
+ break;
+
+ idx++;
+ }
+ g_object_unref (pages);
+
+ if (change & GTK_ACCESSIBLE_CHILD_CHANGE_ADDED)
+ {
+ emit_children_changed (GTK_AT_SPI_CONTEXT (gtk_accessible_get_at_context (GTK_ACCESSIBLE (stack))),
+ GTK_AT_SPI_CONTEXT (gtk_accessible_get_at_context (GTK_ACCESSIBLE (page))),
+ idx,
+ GTK_ACCESSIBLE_CHILD_STATE_ADDED);
+
+ emit_children_changed (GTK_AT_SPI_CONTEXT (gtk_accessible_get_at_context (GTK_ACCESSIBLE (page))),
+ GTK_AT_SPI_CONTEXT (gtk_accessible_get_at_context (child)),
+ 0,
+ GTK_ACCESSIBLE_CHILD_STATE_ADDED);
+ }
+
+ if (change & GTK_ACCESSIBLE_CHILD_CHANGE_REMOVED)
+ {
+ emit_children_changed (GTK_AT_SPI_CONTEXT (gtk_accessible_get_at_context (GTK_ACCESSIBLE (page))),
+ GTK_AT_SPI_CONTEXT (gtk_accessible_get_at_context (child)),
+ 0,
+ GTK_ACCESSIBLE_CHILD_STATE_REMOVED);
+ emit_children_changed (GTK_AT_SPI_CONTEXT (gtk_accessible_get_at_context (GTK_ACCESSIBLE (stack))),
+ GTK_AT_SPI_CONTEXT (gtk_accessible_get_at_context (GTK_ACCESSIBLE (page))),
+ idx,
+ GTK_ACCESSIBLE_CHILD_STATE_REMOVED);
+
+ }
+
+ return;
+ }
if (gtk_widget_get_parent (child_widget) != parent_widget)
{